import cv2
import numpy as np
img_path='./traffic.png'
img=cv2.imread(img_path)            #读取原图像
cv2.imshow("Input",img)             #显示原图像
imgContour=img.copy()               #复制原图像
#将图像的色彩空间从BGR转换为GRAY
imgGray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgBlur=cv2.GaussianBlur(imgGray,(5,5),1)       #高斯滤波
cv2.imshow("Blur",imgBlur)                      #显示滤波后的图像

imgCanny=cv2.Canny(imgBlur,70,200)          #Canny边缘检测
cv2.imshow("Canny",imgCanny)                #显示边缘检测后的图像
contours,hierarchy=cv2.findContours(imgCanny,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)   #查找轮廓
#绘制轮廓
imgContour=cv2.drawContours(imgContour,contours,-1,(0,255,255),2)
cv2.imshow("Contours",imgContour)       #显示绘制轮廓后的图像

for obj in contours:            #遍历所有轮廓
    perimeter=cv2.arcLength(obj,True)   #计算轮廓周长
    #获取轮廓的近似多边形
    approx=cv2.approxPolyDP(obj,0.02*perimeter,True)
    CornerNum=len(approx)           #计算轮廓顶点的数量
    #获取矩形包围框的左上角顶点的坐标值，以及矩形包围框的宽度和高度
    x,y,w,h=cv2.boundingRect(approx)
    if CornerNum==3:            #轮廓的形状识别
        objType="WarningSign"
    elif CornerNum==4:
        objType="IndicativeSign"
    elif CornerNum>4:
        area=cv2.contourArea(obj)       #计算轮廓内区域的面积
        circularity=4*np.pi*area/(perimeter**2) #计算轮廓的圆形度
        if circularity>0.8:
            objType="SpeedLimit"
    #绘制矩形包围框
    cv2.rectangle(imgContour,(x,y),(x+w,y+h),(0,0,255),1)
    cv2.putText(imgContour,objType,(x,y+h+20),
                cv2.FONT_HERSHEY_COMPLEX,0.6,(0,0,0),1) #添加文本
cv2.imshow("Identification",imgContour) #显示添加文本后的图像
cv2.waitKey()
cv2.destroyAllWindows()